#include "tim_out.h"

/*  time tick 延时参数 */ 
static uint16_t TimeTickCnt_S;     
static uint32_t w1MSTickCnt_u32=0;
static uint32_t TimeTcikCountPrevS;      

/******************************************************************************
*
 * 函数介绍: 中断中调用的ms累加计数函数
 * 输入参数: N/A
 * 输出参数: N/A
 * 返回值  : N/A
 
******************************************************************************/
void tick_1ms(void)
{
    w1MSTickCnt_u32++;
}

/******************************************************************************
*
 * 函数介绍: 获得Tick值 单位ms
 * 输入参数: N/A
 * 输出参数: uint32_t
 * 返回值  : Tick值
 
******************************************************************************/
uint32_t Get1MsTickVal(void)
{
    static volatile uint32_t wTickValShade = 0;

    wTickValShade = w1MSTickCnt_u32;   
    
    return wTickValShade;
}

/******************************************************************************
*
 * 函数介绍: 获得Tick值 单位S
 * 输入参数: N/A
 * 输出参数: N/A
 * 返回值  : Tick值
 
******************************************************************************/
uint16_t Get1SecTickVal(void)
{
    static volatile uint16_t wTickValShade = 0;

    wTickValShade = TimeTickCnt_S;   
    
    return wTickValShade;
}

/******************************************************************************
*
 * 函数介绍: 判断给定时间值与现在时间的差值是否超越给定的超时时间。
 * 输入参数: N/A
 * 输出参数：N/A
 * 返回值  ：Tick差值。
 
******************************************************************************/
Is_timeout Get1MsTickInterval(uint32_t wLastTickVal,uint32_t timeout)
{
    static volatile uint32_t wCurTickVal = 0;
    static volatile uint32_t wTickInterval = 0;
    Is_timeout Is_time = no_timeout;

    wCurTickVal = w1MSTickCnt_u32;    
       
    if(wCurTickVal >= wLastTickVal)
    {
        wTickInterval = wCurTickVal - wLastTickVal;
    }
    else
    {
        wTickInterval = (MAX_TICK_VALUE - wLastTickVal) + wCurTickVal;
    }

    if (wTickInterval >= timeout)
    {
        Is_time = yes_timeout;
    }
    
    return Is_time;        
}

/****************************************
* Function Name: delay_times(uint16_t num)
* Description  : 延时
* Arguments    : None
* Return Value : None
****************************************/
void Delay_ms (uint16_t time_value_u16)
{
    uint32_t time_buffer = 0;
    time_buffer = Get1MsTickVal();
    while( no_timeout == Get1MsTickInterval(time_buffer,time_value_u16) );
}

/*
*****************************************************************
*name: TT_TimeTcikCount_S
*descrip: Tick 秒计数 (s)
*****************************************************************
*/
void TimeTcikCount_S(void)
{
    /*  如果够 1S 时间 */
    if(Get1MsTickInterval(TimeTcikCountPrevS,1000))
    {
        TimeTcikCountPrevS = Get1MsTickVal();
        ++TimeTickCnt_S;
    }
}

/*
*****************************************************************
*name: TimeTick_Init
*descrip: Time Tick 模块初始化 
*****************************************************************
*/
void TimeTick_Init(void)
{
    w1MSTickCnt_u32     = 0;
    TimeTickCnt_S       = 0;
    TimeTcikCountPrevS  = Get1MsTickVal();
}
